#ifndef CONTROLADOR_H_
#define CONTROLADOR_H_

#include "Logrador.h"
#include "Usuario.h"
#include "Livro.h"
#include "BDLivro.h"
#include "CarrinhoCompra.h"
#include "../estruturas/ArvoreB.h"
#include "../estruturas/ArvoreC.h"

#include <string>
#include <vector>

using namespace std;

/**
 * @class Controlador Controlador.h "src/kisebo/Controlador.h"
 * @brief Classe que armazena os dados principais.
 * Essa classe armazena os métodos de controle do sistema e \n
 * armazena o usuário logado, os livros do banco de dados e a árvore de interesse \n
 * na sessão.
 */
class Controlador
{
private:

	/**
	 * Caminho do diretório fisico, para subir os dados.
	 */
	string dirDados;

	/**
	 * Usuário logado no sistema.
	 * @see Usuario
	 */
	Usuario usuarioCorrente;

	/**
	 * Classe de banco de dados dos livros.
	 * @see BDLivro
	 */
	BDLivro bdLivro;

	/**
	 * Arvore dos usuarios encontrados no arquivo logins.txt
	 * @see ArvoreB
	 * @see Usuario
	 */
	ArvoreB<string, Usuario> usuarios;

	/**
	 * Arvore dos logradorouros encontrados no arquivo logradouros.txt
	 * @see ArvoreB
	 * @see Logrador
	 */
	ArvoreB<string, Logrador> logradores;

	/**
	 * Arvore dos montada de acordo com o Interesse selecionado.
	 * @see ArvoreC
	 * @see Livro
	 */
	ArvoreC<string, Livro> arvoreInteresse;


public:

	/**
	 * @fn Controlador().
	 * @brief Construtor padrão
	 * O Construtor já seta o diretório de dados, carrega os logins e os livros.
	 */
	Controlador();

	/**
	 * @fn virtual ~Controlador()
	 * @brief Destrutor da classe.
	 * Libera a mémoria ocupada pela classe na mémoria.
	 */
	virtual ~Controlador();

	void Init();

	// Caso de Uso 1
	void CarregaLogins();
	Usuario CheckLogin(string _login, string _senha);

	// Caso de Uso 2
	long GetProximoLivroID();
	void AdicionaLivro(Livro _novoLivro);

	// Caso de Uso 3
	Livro SelecionaLivro(long _id);
	void AtualizaLivrosVendidos(CarrinhoCompra _carrinhoCompra);
	void RegistraVenda(CarrinhoCompra _carrinhoCompra);

	// Caso de Uso 4
	Logrador PesquisaCEP(string _cep);
	void RegistraUsuario(Usuario _usuario);
	void CarregaLogradores();

	// Caso de Uso 5, 6 e 7

	/**
	 * @fn Usuario GetUsuario()
	 * @brief Obtem ousuário logado.
	 * @pre Deve haver um usuário logado.
	 */
	Usuario GetUsuario();

	/**
	 * @fn void MontaPesquista(Interesse::ENUM_INTERESSE _tipoInteresse)
	 * @brief Monta a árvore de pesquisa baseado no interesse selecionado.
	 * @pre Selecionar um interesse.
	 */
	void MontaPesquista(Interesse::ENUM_INTERESSE _tipoInteresse);

	/**
	 * @fn vector<Livro> PesquisaInteresses(string _valor)
	 * @brief Pesquisa na árvore de pesquisa com a chave informada.
	 * @pre devemos montar a árvore de pesquisa.
	 */
	vector<Livro> PesquisaInteresses(string _valor);

	/**
	 * @fn void AtualizaCliente(Usuario _cliente)
	 * @brief Atualiza o usuário no sistema.
	 * Atualiza o usuário na sessão no usuarioCorrente e nos arquivos txt, \n
	 * atualizando os arquivos logins_livros.txt para os livros de interesse e \n
	 * logins_interesses.txt para os interesses criados.
	 */
	void AtualizaCliente(Usuario _cliente);

};

#endif /*CONTROLADOR_H_*/
